// 导入express库
let express = require('express')

// 创建一个轻服务器框架
let app = express()

//链接mongodb数据库
let mongoose = require("mongoose")
// mongoose.connect('mongodb://数据库IP地址:端口号/数据库名称')
mongoose.connect('mongodb://localhost:27017/myschool', { useNewUrlParser: true })
    .then(() => { console.log("数据库链接成功") })
    .catch(() => { console.log(err, "数据库连接失败") });

//Schema 主要用于定义 MongoDB 中集合 Collection 里文档 document 的结构，mongoose 对表结构的定义
//，每个 Schema 会映射到mongodb中的一个 collection，Schema 不具备操作数据库的能力。
const userSchema = new mongoose.Schema({
    name: { type: String, required: true },
    password: { type: Number, required: true }
})
//model是由 Schema 生成的模型，可以对数据库的操作。model的每一个实例（instance）就是一个文档。
//发布为模型只需调用mongoose的 mongoose.model() 方法即可，mongoose.model() 接收两个参数
//，第一个参数表示模型的名称，第二个参数是 Schema，返回值为模型构造函数。
//一定要把第一个参数设置成和 mongoose.model() 的返回值相同，否则会出错
const User = mongoose.model('User', userSchema)


let jwt = require("jsonwebtoken")
//允许跨域
let cors = require("cors")
app.use(cors())
//设置允许接收json数据
app.use(express.json())
// 设置允许接收urlencoded格式的数据
app.use(express.urlencoded({ extended: false }))
//监听一个端口号
app.listen(3000, () => {
    console.log('微服务已启动，端口号为3000')
})
// http://192.168.31.234:3000/add
//http://192.168.0.8:3000/list
// 创建一个get请求方式的接口
app.get('/list', (req, res) => {
    res.setHeader('Access-Control-Allow-Origin', 'application/json')
    res.send({
        state: '200',
        body: '获取成功'
    })
})
// 接收请求
app.post('/add', (req, res) => {
    // 接收请求参数 
    console.log(req.body);
    res.setHeader('Access-Control-Allow-Origin', 'application/json')
    res.send({
        state: '200',
        body: '注册成功，注册地址是"/PT/Plug_PT_TEST"'
    })
})
//增
app.post('/users', async (req, res) => {
    // const model = await req.User.create(req.body)
    const data = req.body
    await User.create(data)
    res.send("添加成功")
})
//删
app.delete('/users/:name', async (req, res) => {
    // await req.User.findByIdAndDelete(req.params.id, req.body)
    const user = await User.find({ name: req.params.name }, function (err, docs) {
        if (!err) {
            console.log(docs)
        }
    })
    if (user) {
        await user.remove()
        res.send({
            success: true
        })
    } else {
        res.send("删除失败，原文件不存在")
    }
})
//改
app.put('/users/:name', async (req, res) => {
    // const user = await req.User.findByIdAndUpdate(req.params.id, req.body)
    const user = await User.Find({ name: req.params.name })
    user.name = req.body.name
    await model.save()
    res.send("修改成功")
})
//查
// 根据id查询数据（查）
app.get('/users/:name', async (req, res) => {
    // const user = await req.User.findById(req.params.id)
    const user = await User.find().where({ name: req.params.name })
    // const user = await User.find().sort({ _id: -1}) // id是十六进制的值，能比较大小，-1表示倒序
    // const user = await User.find().skip(1).limit(2)
    //skip跳过多少条，limit限制查找多少条，可以实现分页
    res.send(user)
})
//登录
app.post('/login', (req, res) => {
    //生成token令牌
    // console.log(req.body)
    let token = jwt.sign({
        password: req.body.password
    }, "abc")
    // console.log(token)
    //回调函数必须带上，否则不会查
    User.find({ password: req.body.password }, function (err, docs) {
        if (!err && docs.length > 0) {
            // console.log(docs)
            //将token和数据库信息返回给前端
            res.send({
                err: 0,
                msg: "用户登录成功",
                data: { name: 'three', password: 333333 },
                token: token
            })
        } else {
            console.log("err")
            res.send({
                err: 1,
                msg: '用户不存在'
            })
        }
    })
})
//校验token
app.post('/api/check', (req, res) => {
    //获取用户端传过来的token
    let token = req.query.token || req.body.token || req.headers.token
    // console.log(token)
    //校验token
    jwt.verify(token, "abc", (err, decode) => {
        //第一个参数传递token,此处的token不能带“”
        //第二个参数传递加密规则
        console.log("err", err)
        console.log("decode", decode)
        if (err) {
            res.send({
                err: 1,
                msg: "登陆信息失效，请重新登陆"
            })
        } else {
            res.send({
                err: 0,
                msg: "登陆成功",
                data: "data"
            })
        }
    })
})


